package com.ifreshwing.socket;

import com.ifreshwing.utils.Log;

import java.io.BufferedWriter;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.net.Socket;

/**
 * Created by lz on 2017/5/3.
 */

public class SocketConnect {
    private static Socket socket;
    private static String CIP = "123.56.253.63";
    private static int PORTS = 8801;

    private SocketConnect() {}
    private static volatile SocketConnect instance;


    public static synchronized SocketConnect getInstance(){
        if(instance == null){
            synchronized (SocketConnect.class){
                if(instance == null){
                    instance = new SocketConnect();
                }
            }
        }
        return instance;
    }

    public void initSocket() {
        try {
            // 客户端 Socket 可以通过指定 IP 地址或域名两种方式来连接服务器端,实际最终都是通过 IP 地址来连接服务器
            // 新建一个Socket，指定其IP地址及端口号
            socket = new Socket(CIP, PORTS);
            // 客户端socket在接收数据时，有两种超时：1. 连接服务器超时，即连接超时；2. 连接服务器成功后，接收服务器数据超时，即接收超时
            // 设置 socket 读取数据流的超时时间
            socket.setSoTimeout(5000);
            // 发送数据包，默认为 false，即客户端发送数据采用 Nagle 算法；
            // 但是对于实时交互性高的程序，建议其改为 true，即关闭 Nagle 算法，客户端每发送一次数据，无论数据包大小都会将这些数据发送出去
            socket.setTcpNoDelay(true);
            // 设置客户端 socket 关闭时，close() 方法起作用时延迟 30 秒关闭，如果 30 秒内尽量将未发送的数据包发送出去
            socket.setSoLinger(true, 30);
            // 设置输出流的发送缓冲区大小，默认是4KB，即4096字节
            socket.setSendBufferSize(4096);
            // 设置输入流的接收缓冲区大小，默认是4KB，即4096字节
            socket.setReceiveBufferSize(4096);
            // 作用：每隔一段时间检查服务器是否处于活动状态，如果服务器端长时间没响应，自动关闭客户端socket
            // 防止服务器端无效时，客户端长时间处于连接状态
            socket.setKeepAlive(true);
            // 客户端向服务器端发送数据，获取客户端向服务器端输出流


        } catch (Exception e) {
            e.printStackTrace();
        }
    }

    public void connect2server(String msg) {
        new Thread() {
            @Override
            public void run() {
                super.run();
                try {
                    socket = new Socket(CIP, PORTS);
                    try {
                        PrintWriter writer = new PrintWriter(new BufferedWriter(new OutputStreamWriter(socket.getOutputStream())), true);
                        writer.println(msg);
                        if (socket.isConnected() && !socket.isClosed()) {
                            InputStream inputStream = socket.getInputStream();
                            byte[] bytes = new byte[inputStream.available()];
                            inputStream.read(bytes);
                            String result = new String(bytes);
                            Log.e(result);
                        }
                    } catch (Exception e) {
                        e.printStackTrace();
                    }
                } catch (IOException e) {
                    e.printStackTrace();
                }

            }
        }.start();

    }
}
